package com.example.demo.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/** 
* @ClassName: PhoneNumberMaskingUtil 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author majie
* @date 2024年12月24日  
*/
public class PhoneNumberMaskingUtil {

    // 正则表达式匹配11位的数字串（手机号）
    private static final String PHONE_NUMBER_REGEX = "\\b\\d{3}\\d{4}\\d{4}\\b";
 
    /**
     * 将字符串中的11位手机号做脱敏处理，将手机号中间四位替换为`*`
     *
     * @param input 输入字符串
     * @return 脱敏处理后的字符串
     */
    public static String maskPhoneNumber(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }
 
        // 使用正则表达式编译模式
        Pattern pattern = Pattern.compile(PHONE_NUMBER_REGEX);
        Matcher matcher = pattern.matcher(input);
 
        // 使用StringBuffer来构建替换后的字符串
        StringBuffer result = new StringBuffer();
 
        // 遍历匹配结果并进行替换
        while (matcher.find()) {
            // 获取整个匹配的手机号
            String fullNumber = matcher.group();
            // 将手机号的前三位和后四位保留，中间四位替换为*
            String maskedNumber = fullNumber.substring(0, 3) + "****" + fullNumber.substring(7);
            // 将替换后的手机号放入结果中
            matcher.appendReplacement(result, maskedNumber);
        }
 
        // 将剩余未匹配的部分添加到结果中
        matcher.appendTail(result);
 
        return result.toString();
    }
 
    /**
     * 对字符串中的手机号进行脱敏处理的方法
     *
     * @param input 输入的包含手机号（可能）的原始字符串
     * @return 处理后的字符串，其中手机号中间四位被替换为*
     */
    public static String desensitizePhoneNumbers(String input) {
        // 定义正则表达式，用于精确匹配连续11位数字（即手机号形式），\b表示单词边界，确保是独立的11位数字
        String phoneRegex = "\\b\\d{11}\\b";
        Pattern pattern = Pattern.compile(phoneRegex);
        Matcher matcher = pattern.matcher(input);

        // 创建StringBuffer用于构建处理后的字符串
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            // 获取当前匹配到的11位数字（视作手机号）
            String phoneNumber = matcher.group();
            // 对手机号进行脱敏处理，将中间四位替换为*
            String desensitizedPhone = phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
            // 将替换后的手机号添加回原位置
            matcher.appendReplacement(sb, desensitizedPhone);
        }
        // 将剩余未处理的部分添加到结果中
        matcher.appendTail(sb);

        return sb.toString();
    }
    
    /**
     * 对字符串中的手机号进行脱敏处理，只匹配连续11位的数字，中间四位替换为*
     *
     * @param input 输入字符串
     * @return 脱敏后的字符串
     */
    public static String maskPhoneNumberxx(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        // 使用正则表达式匹配连续11位的数字
        return input.replaceAll("(?<!\\d)\\d{3}\\d{4}\\d{4}(?!\\d)", "$1****$2");        
    }

    // 脱敏手机号的方法
    public static String desensitizePhoneNumber(String input) {
        // 正则表达式匹配11位连续数字
        String regex = "(\\d{3})\\d{4}(\\d{4})";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        // 使用StringBuffer来构建新的字符串
        StringBuffer result = new StringBuffer();

        // 替换手机号中间四位为*
        while (matcher.find()) {
            String maskedPhone = matcher.group(1) + "****" + matcher.group(2);
            matcher.appendReplacement(result, maskedPhone);
        }
        matcher.appendTail(result);
        
        return result.toString();
    }
    
    public static void main(String[] args) {
        String text = "我的手机号是13812345678，另一个手机号是13987654321。";
        String maskedText = maskPhoneNumber(text);
        System.out.println(maskedText);  // 输出: 我的手机号是138****5678，另一个手机号是139****4321。
    
        String mm = "请核实是否符合《电信用户申诉处理办法》（中华人民共和国工业和信息化部令第35号）相关要求姓名代鑫邮政编码工作单位联系电话13812345678电子邮箱被申诉企业中国移动申诉内容 11";
        System.out.println(maskPhoneNumber(mm));
        
        String texxt = "我的手机号是13812345678，另一个手机号是13987654321，还有一个不是手机号的123456789012。";
        String maskedTexts = desensitizePhoneNumber(texxt);
        System.out.println(maskedTexts);  // 输出: 我的手机号是138****5678，另一个手机号是139****4321，还有一个不是手机号的123456789012。
    
    
        
    }
    
}
